// ignore_for_file: file_names, must_be_immutable, constant_identifier_names, slash_for_doc_comments, avoid_unnecessary_containers, prefer_const_constructors, unnecessary_cast, sized_box_for_whitespace, prefer_function_declarations_over_variables, overridden_fields, annotate_overrides, prefer_const_literals_to_create_immutables, unnecessary_null_comparison, deprecated_member_use

import 'package:mybase/base/tool/time/FFTime.dart';

///内存缓存，可设置过期时间
///重新启动 内容会消失
class JJMemoryCache {
  // 单例公开访问点
  factory JJMemoryCache() => _sharedInstance();

  // 静态、同步、私有访问点
  static JJMemoryCache _sharedInstance() {
    return _instance;
  }

  // 静态私有成员，没有初始化
  static final JJMemoryCache _instance = JJMemoryCache._();

  // 私有构造函数
  JJMemoryCache._() {}

  Map<String, JJMemoryCacheEntity> _map = {};

  /**
   * @title 存数据
   * @param expire  多少秒后过期。<=0：不过期
   */
  void set(String key, dynamic value, {int expire = 0}) {
    if (expire > 0) expire = FFTime.nowSecond() + expire;
    _map[key] = JJMemoryCacheEntity(key, value, expire);
  }

  /**
   * @title 取数据
   * @info  有可能会空，比如数据没有，超时
   * @param T? 当时存进去的类型
   * @return
   */
  T? get<T>(String key) {
    if (!_map.containsKey(key)) return null;

    JJMemoryCacheEntity? entity = _map[key];
    if (entity == null) return null;

    dynamic value;
    if (entity.expire <= 0) {
      // 没有过期时间
      value = entity.value;
    } else {
      // 有过期时间
      if (FFTime.nowSecond() < entity.expire) {
        // 没有过期
        value = entity.value;
      } else {
        // 过期
        remove(key);
      }
    }

    if (value != null) {
      if (value is T) {
        // 类型对，就返回
        return value;
      }
    }

    return null;
  }

  /**
   * @title 移除数据
   */
  void remove(String key) {
    _map.remove(key);
  }
}

class JJMemoryCacheEntity {
  String key;
  dynamic value;
  int expire;

  JJMemoryCacheEntity(
    this.key,
    this.value,
    this.expire,
  );
}
